home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 June / EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso / earcd / utilsys / rss14gmd.lha / RSys_1.4gmd / C / TreeHunks.c < prev    next >
C/C++ Source or Header  |  1996-05-04  |  12KB  |  518 lines

  1. /*
  2.    ***************************************************************************
  3.    *
  4.    * Datei:
  5.    *    RSysTreeHunks.c
  6.    *
  7.    * Inhalt:
  8.    *
  9.    *      --- Globale Routinen ---
  10.    *
  11.    *    BOOL ClickedCloseGadget ( void );
  12.    *    long OpenTreeWindow ( char *name , int hunk );
  13.    *    void PrintTree ( Objid *obj );
  14.    *
  15.    *      --- Lokale  Routinen ---
  16.    *
  17.    *    static RSYS_diskhunkentry *makede ( RSYS_diskhunkentry *last , int depth , char *name , int lastde );
  18.    *    static TEXTFONT *Toggleibm8Font ( void );
  19.    *    static void ScanDirs ( char *name , int depth , int lastde );
  20.    *    static void ToggleListView ( ULONG code );
  21.    *
  22.    * Bemerkungen:
  23.    *    Routinen zur Anzeige von Verzeichnisbäumen und
  24.    *    Hunk-Strukturen ausführbarer Files.
  25.    *
  26.    * Erstellungsdatum:
  27.    *    07-Jul-93    Rolf Böhme
  28.    *
  29.    * Änderungen:
  30.    *    07-Jul-93    Rolf Böhme    Erstellung
  31.    *
  32.    ***************************************************************************
  33.  */
  34.  
  35. #include "RSys.h"
  36. #include "protos.h"
  37.  
  38. static TEXTFONT *Toggleibm8Font (void);
  39.  
  40.  
  41. static RSYS_diskhunkentry *loop, *firstde;
  42. static LIST Tree;
  43. static REMEMBER *dekey = NULL;
  44.  
  45. static UBYTE *KindCY0Labels[] =
  46. {
  47.   (UBYTE *) "Tree",
  48.   (UBYTE *) "Path",
  49.   NULL
  50. };
  51.  
  52. static ULONG mask = 0L;
  53.  
  54.  /*
  55.   * makede() erzeugt ein Element einer verketteten Liste, deren
  56.   * Elemente später in ein ListView eingebracht werden. Dabei wird
  57.   * ein Eintrag mit einem vollständigen Dateinamen und einer
  58.   * Baumstrukturdarstellung erzeugt
  59.   */
  60. static RSYS_diskhunkentry *
  61. makede (RSYS_diskhunkentry * last, int depth, char *name, int lastde)
  62. {
  63.   int i;
  64.   char fpart[MAXFULLNAME];
  65.   static int max = -1;
  66.  
  67.   strncpy (fpart, (char *) FilePart ((UBYTE *) name), MAXFULLNAME);
  68.  
  69.   if ((last = (RSYS_diskhunkentry *) AllocRemember (RKEY, SIZEDE, MEMF_CLEAR | MEMF_ANY)) &&
  70.       (last->name = (char *) AllocRemember (RKEY, BUFSIZE, MEMF_CLEAR | MEMF_ANY)) &&
  71.       (last->fullname = (char *) AllocRemember (RKEY, strlen (name) + 3, MEMF_CLEAR | MEMF_ANY)))
  72.     {
  73.       last->next = NULL;
  74.       last->denode.ln_Name = last->name;
  75.       last->denode.ln_Type = 0;
  76.  
  77.       for (i = depth + 1; i <= max; i++)
  78.     UNSET (i);
  79.  
  80.       max = depth;
  81.  
  82.       if (lastde)
  83.     SET (depth);
  84.       else
  85.     UNSET (depth);
  86.  
  87.       strcpy (last->fullname, name);
  88.  
  89.       if (depth != 0)
  90.     strcat (last->fullname, "/");
  91.  
  92.       if (depth == 0)
  93.     strncpy (last->name, name, BUFSIZE);
  94.       else
  95.     {
  96.       if (depth == 1)
  97.         {
  98.           if (tf)
  99.         strncpy (last->name, (lastde ? ILASTDIR ISUBDIR : IDIR ISUBDIR), BUFSIZE);
  100.           else
  101.         strncpy (last->name, (lastde ? "\`" ASUBDIR : ADIR ASUBDIR), BUFSIZE);
  102.  
  103.           strncat (last->name, fpart, BUFSIZE - strlen (last->name) - 1);
  104.         }
  105.       else
  106.         {
  107.           if (IS_SET (1))
  108.         strncpy (last->name, "   ", BUFSIZE);
  109.           else
  110.         strncpy (last->name, (tf ? ILEVEL : ALEVEL), BUFSIZE);
  111.  
  112.           for (i = 2; i < depth; i++)
  113.         if (IS_SET (i))
  114.           strncat (last->name, "   ", BUFSIZE - strlen (last->name) - 1);
  115.         else
  116.           strncat (last->name, (tf ? ILEVEL : ALEVEL), BUFSIZE - strlen (last->name) - 1);
  117.  
  118.           if (tf)
  119.         strncat (last->name, (lastde ? ILASTDIR ISUBDIR : IDIR ISUBDIR), BUFSIZE - strlen (last->name) - 1);
  120.           else
  121.         strncat (last->name, (lastde ? "\`" ASUBDIR : ADIR ASUBDIR), BUFSIZE - strlen (last->name) - 1);
  122.  
  123.           strncat (last->name, fpart, BUFSIZE - strlen (last->name) - 1);
  124.         }
  125.     }
  126.  
  127.       InitListView (TreeWnd, TreeGadgets[GD_TreeLV - GD_TreeLV], NULL, UNSETLVPOS);
  128.  
  129.       AddTail (&Tree, &last->denode);
  130.  
  131.       InitListView (TreeWnd, TreeGadgets[0], &Tree, decnt);
  132.  
  133.       decnt++;
  134.  
  135.       return last->next;
  136.     }
  137.   else
  138.     ErrorHandle ("Directory tree", MEMORY_ERR, ALLOC_FAIL, KILL);
  139.  
  140.   return NULL;
  141. }
  142.  
  143.  /*
  144.   * ClickedCloseGadget() prüft, ob das CloseGadget geklickt
  145.   * worden ist und bietet eine Abfrage an, ob die laufenden
  146.   * Operation abgebrochen werden soll
  147.   */
  148. BOOL
  149. ClickedCloseGadget (void)
  150. {
  151.   INTUIMESSAGE *mess;
  152.   ULONG class;
  153.   BOOL ret = FALSE;
  154.  
  155.   while ((mess = (INTUIMESSAGE *)
  156.       GT_GetIMsg (TreeWnd->UserPort)) != NULL)
  157.     {
  158.       class = mess->Class;
  159.       GT_ReplyIMsg (mess);
  160.  
  161.       if ((class == IDCMP_CLOSEWINDOW) && Question (TreeWnd, "Do you want to cancel reading?", YES))
  162.     {
  163.       ret = TRUE;
  164.       breakit = TRUE;
  165.     }
  166.     }
  167.  
  168.   return (ret);
  169. }
  170.  
  171.  /*
  172.   * ScanDirs() durchläuft rekursiv eine vorgegebene Directory
  173.   * und baut dabei eine Baumstruktur auf
  174.   */
  175. static void
  176. ScanDirs (char *name, int depth, int lastde)
  177. {
  178.   EXALLCONTROL *eac;
  179.   EXALLDATA *EAData, *ead, *eadtmp;
  180.   int more;
  181.   BPTR lock;
  182.   UBYTE newdir[MAXFULLNAME];
  183.  
  184.   if (ClickedCloseGadget () || breakit)
  185.     return;
  186.  
  187.   loop = makede (loop, depth, name, lastde);
  188.  
  189.   if (NOT (lock = Lock ((UBYTE *) name, ACCESS_READ)))
  190.     return;
  191.  
  192.   if (eac = AllocDosObject (DOS_EXALLCONTROL, NULL))
  193.     {
  194.       eac->eac_LastKey = 0;
  195.  
  196.       EAData = MyAllocVec ((MAXLARGEMEM + 1) * sizeof (EXALLDATA), MEMF_ANY | MEMF_CLEAR, NO_KILL);
  197.  
  198.       if (EAData)
  199.     {
  200.       do
  201.         {
  202.           more = ExAll (lock, EAData, MAXLARGEMEM * sizeof (EXALLDATA), ED_SIZE, eac);
  203.  
  204.           if ((!more) && (IoErr () != ERROR_NO_MORE_ENTRIES))
  205.         {
  206.           ErrorHandle (name, DOS_EXALL_ERR, EXALL_FAIL, NO_KILL);
  207.           break;
  208.         }
  209.  
  210.           if (eac->eac_Entries == 0)
  211.         continue;
  212.  
  213.           ead = EAData;
  214.  
  215.           do
  216.         {
  217.           if (ead->ed_Type > 0)
  218.             {
  219.               int lastentry = TRUE;
  220.  
  221.               strcpy ((char *) newdir, name);
  222.  
  223.               for (eadtmp = ead->ed_Next; eadtmp; eadtmp = eadtmp->ed_Next)
  224.             if (eadtmp->ed_Type > 0)
  225.               {
  226.                 lastentry = FALSE;
  227.                 break;
  228.               }
  229.  
  230.               if (AddPart (newdir, ead->ed_Name, MAXFULLNAME))
  231.             ScanDirs ((char *) newdir, depth + 1, lastentry);
  232.             }
  233.  
  234.           ead = ead->ed_Next;
  235.         }
  236.           while (ead);
  237.         }
  238.       while (more);
  239.  
  240.       MyFreeVec (EAData);
  241.     }
  242.  
  243.       FreeDosObject (DOS_EXALLCONTROL, eac);
  244.     }
  245.   else
  246.     ErrorHandle ("ExAll()-Control", MEMORY_ERR, ALLOC_FAIL, NO_KILL);
  247.  
  248.   UnLock (lock);
  249.  
  250.   return;
  251. }
  252.  
  253. static TEXTFONT *
  254. Toggleibm8Font (void)
  255. {
  256.   STATIC BOOL Access = FALSE;
  257.   STATIC TEXTFONT *ibm8Font = NULL;
  258.  
  259.   Access ^= TRUE;
  260.  
  261.   if (Access)
  262.     ibm8Font = OpenDiskFont (&tree_ta);
  263.   else if (ibm8Font)
  264.     {
  265.       CloseFont (ibm8Font);
  266.       ibm8Font = NULL;
  267.     }
  268.  
  269.   return ibm8Font;
  270. }
  271.  
  272.  /*
  273.   * OpenTreeWindow() öffnet das Kontrollfenster zur Ausgabe
  274.   * eines Verzeichnisbaumes
  275.   */
  276. long
  277. OpenTreeWindow (char *name, int hunk)
  278. {
  279.   NEWGADGET ng;
  280.   GADGET *g;
  281.   UWORD wleft = 113, wtop = 26, ww, wh;
  282.   int gl[] =
  283.   {GD_TreeLV - GD_TreeLV};
  284.  
  285.   AdjustWindowDimensions (Scr, (UWORD) 113, (UWORD) 26, (UWORD) 463, (UWORD) 143,
  286.               &wleft, &wtop, &ww, &wh);
  287.  
  288.   if (NOT (g = CreateContext (&TreeGList)))
  289.     return (1L);
  290.  
  291.   ng.ng_LeftEdge = compute (OffX, FontX, 8);
  292.   ng.ng_TopEdge = compute (OffY, FontY, 21);
  293.   ng.ng_Width = compute ((UWORD) 0, FontX, 449);
  294.   ng.ng_Height = compute ((UWORD) 0, FontY, 116);
  295.   ng.ng_GadgetText = (UBYTE *) name;
  296.   ng.ng_TextAttr = (tf ? &tree_ta : Font);
  297.   ng.ng_GadgetID = GD_TreeLV;
  298.   ng.ng_Flags = PLACETEXT_ABOVE | NG_HIGHLABEL;
  299.   ng.ng_VisualInfo = VisualInfo;
  300.  
  301.   g = CreateGadget (LISTVIEW_KIND, g, &ng,
  302.             GTLV_Labels, NULL,
  303.             GTLV_ReadOnly, (hunk ? TRUE : FALSE),
  304.             TAG_DONE);
  305.  
  306.   TreeGadgets[0] = g;
  307.   makelabelvisible (TreeGadgets[0]);
  308.  
  309.   ng.ng_LeftEdge = compute (OffX, FontX, 368);
  310.   ng.ng_TopEdge = compute (OffY, FontY, 5);
  311.   ng.ng_Width = compute ((UWORD) 0, FontX, 89);
  312.   ng.ng_Height = compute ((UWORD) 0, FontY, 13);
  313.   ng.ng_GadgetText = NOT (hunk) ? (UBYTE *) "Save Tree" : (UBYTE *) "Save List";
  314.   ng.ng_TextAttr = Font;
  315.   ng.ng_GadgetID = GD_SaveGad;
  316.   ng.ng_Flags = PLACETEXT_IN;
  317.  
  318.   g = CreateGadget (BUTTON_KIND, g, &ng, TAG_DONE);
  319.  
  320.   TreeGadgets[1] = g;
  321.   makelabelvisible (TreeGadgets[1]);
  322.  
  323.   if (NOT (hunk))
  324.     {
  325.       ng.ng_LeftEdge = compute (OffX, FontX, 8);
  326.       ng.ng_Width = compute ((UWORD) 0, FontX, 105);
  327.       ng.ng_GadgetText = NULL;
  328.       ng.ng_TextAttr = Font;
  329.       ng.ng_GadgetID = GD_KindCY;
  330.       ng.ng_Flags = 0;
  331.  
  332.       g = CreateGadget (CYCLE_KIND, g, &ng, GTCY_Labels, &KindCY0Labels[0], TAG_DONE);
  333.  
  334.       TreeGadgets[2] = g;
  335.     }
  336.   else
  337.     {
  338.       ng.ng_LeftEdge = compute (OffX, FontX, 8);
  339.       ng.ng_Width = compute ((UWORD) 0, FontX, 105);
  340.       ng.ng_GadgetText = (UBYTE *) "Load";
  341.       ng.ng_TextAttr = Font;
  342.       ng.ng_GadgetID = GD_KindCY;
  343.       ng.ng_Flags = 0;
  344.  
  345.       g = CreateGadget (BUTTON_KIND, g, &ng, TAG_DONE);
  346.  
  347.       TreeGadgets[2] = g;
  348.     }
  349.  
  350.   if (NOT g)
  351.     return (2L);
  352.  
  353.   if (NOT (TreeWnd = OpenWindowTags (NULL,
  354.                      WA_Left, wleft,
  355.                      WA_Top, wtop,
  356.                      WA_Width, ww,
  357.                      WA_Height, wh,
  358.                      WA_IDCMP, BUTTONIDCMP |
  359.                      LISTVIEWIDCMP |
  360.                      IDCMP_MOUSEBUTTONS |
  361.                      IDCMP_MOUSEMOVE |
  362.                      IDCMP_CLOSEWINDOW |
  363.                      IDCMP_VANILLAKEY |
  364.                      IDCMP_REFRESHWINDOW,
  365.                      WA_Flags, WFLG_DRAGBAR |
  366.                      WFLG_DEPTHGADGET |
  367.                      WFLG_CLOSEGADGET |
  368.                      WFLG_SMART_REFRESH |
  369.                      WFLG_ACTIVATE |
  370.                      WFLG_RMBTRAP,
  371.                      WA_Title, hunk ? TreeWdt1 : TreeWdt,
  372.                      WA_PubScreenFallBack, TRUE,
  373.                      WA_PubScreen, Scr,
  374.                      TAG_DONE)))
  375.     return 4L;
  376.  
  377.   RefreshRastPort (TreeWnd, TreeGadgets, gl, 1, FALSE, TreeGList);
  378.  
  379.   return NULL;
  380. }
  381.  
  382.  /*
  383.   * ToggleListView() schaltet zwischen der Baum- und der
  384.   * Dateidarstellung der Verzeichniseinträge um
  385.   */
  386. static void
  387. ToggleListView (ULONG code)
  388. {
  389.   RSYS_diskhunkentry *de;
  390.   NODE *node;
  391.  
  392.   InitListView (TreeWnd, TreeGadgets[0], NULL, UNSETLVPOS);
  393.  
  394.   for (node = Tree.lh_Head; node->ln_Succ; node = node->ln_Succ)
  395.     {
  396.       de = (RSYS_diskhunkentry *) node;
  397.       node->ln_Name = ((code == 0L) ? de->name : de->fullname);
  398.     }
  399.  
  400.   InitListView (TreeWnd, TreeGadgets[0], &Tree, UNSETLVPOS);
  401.  
  402.   return;
  403. }
  404.  
  405.  /*
  406.   * PrintTree() öffnet ein Fenster und gibt alle Verzeichnisse eines
  407.   * Verzeichnisobjektes obj in einem ListView aus
  408.   */
  409. void
  410. PrintTree (RSYS_Objid * obj)
  411. {
  412.   INTUIMESSAGE *message;
  413.   ULONG class, code;
  414.   APTR object;
  415.   NODE *node;
  416.   int id;
  417.  
  418.   DPOS;
  419.  
  420.   Flags.quit_tree = 0;
  421.  
  422.   tf = Toggleibm8Font ();
  423.  
  424.   NewList (&Tree);
  425.  
  426.   if (NOT (OpenTreeWindow (obj->fullname, FALSE)))
  427.     {
  428.       LockMainWindow (WIN_LOCK);
  429.  
  430.       decnt = 0;
  431.       breakit = FALSE;
  432.  
  433.       loop = firstde;
  434.  
  435.       PrintInfo ("Scanning Device", SPEAK, 0);
  436.  
  437.       SetWindowTitles (TreeWnd, (UBYTE *) "<- Cancel reading Tree...",
  438.                NOSCREENTITLECHANGE);
  439.  
  440.       EnableGadget (TreeWnd, TreeGadgets[GD_SaveGad - GD_TreeLV], FALSE);
  441.       EnableGadget (TreeWnd, TreeGadgets[GD_KindCY - GD_TreeLV], FALSE);
  442.  
  443.       ScanDirs (obj->fullname, 0, TRUE);
  444.  
  445.       SetWindowTitles (TreeWnd, TreeWdt, NOSCREENTITLECHANGE);
  446.  
  447.       EnableGadget (TreeWnd, TreeGadgets[GD_SaveGad - GD_TreeLV], TRUE);
  448.       EnableGadget (TreeWnd, TreeGadgets[GD_KindCY - GD_TreeLV], TRUE);
  449.  
  450.       do
  451.     {
  452.       Wait (1L << TreeWnd->UserPort->mp_SigBit);
  453.  
  454.       while ((message = (INTUIMESSAGE *) GT_GetIMsg (TreeWnd->UserPort)) != NULL)
  455.         {
  456.           class = message->Class;
  457.           code = message->Code;
  458.           object = message->IAddress;
  459.  
  460.           GT_ReplyIMsg (message);
  461.  
  462.           switch (class)
  463.         {
  464.         case IDCMP_CLOSEWINDOW:
  465.           Flags.quit_tree = 1;
  466.           break;
  467.  
  468.         case IDCMP_GADGETUP:
  469.           id = ((GADGET *) object)->GadgetID;
  470.  
  471.           HandleHelp ((enum RSysNumbers) id);
  472.  
  473.           switch (id)
  474.             {
  475.             case GD_TreeLV:
  476.               if (node = GetNode (&Tree, code))
  477.             DisplayDirectoryInfo (((RSYS_diskhunkentry *) node)->fullname);
  478.               break;
  479.  
  480.             case GD_SaveGad:
  481.               if (GetFile (TreeWnd, "RAM:", "RSys-Tree.DAT", "#?.dat",
  482.                  "Select File for saving treelist", "Save"))
  483.             SaveList (TreeWnd, (char *) _fullpath, (char *) obj->fullname, &Tree, FALSE);
  484.               break;
  485.  
  486.             case GD_KindCY:
  487.               ToggleListView (code);
  488.               break;
  489.             }
  490.           break;
  491.  
  492.         case IDCMP_VANILLAKEY:
  493.           if ((char) code == ESC)
  494.             Flags.quit_tree = 1;
  495.           break;
  496.         }
  497.         }
  498.     }
  499.       while (NOT (Flags.quit_tree));
  500.  
  501.       InitListView (TreeWnd, TreeGadgets[GD_TreeLV - GD_TreeLV], NULL, UNSETLVPOS);
  502.  
  503.       NewList (&Tree);
  504.  
  505.       FreeRemember (RKEY, TRUE);
  506.  
  507.       CloseASysWindow (&TreeWnd, &TreeGList, NULL);
  508.  
  509.       LockMainWindow (WIN_UNLOCK);
  510.     }
  511.   else
  512.     ErrorHandle ((char *) TreeWdt, WINDOW_ERR, OPEN_FAIL, NO_KILL);
  513.  
  514.   Toggleibm8Font ();
  515.  
  516.   return;
  517. }
  518.